#include <iostream>
#include <unordered_set>
using namespace std;

// Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
 
// class Solution {
// public:
//     ListNode* removeDuplicateNodes(ListNode* head) {
//         ListNode* ob = head;
//         while(ob != nullptr)
//         {
//             ListNode* oc = ob;
//             while(oc->next != nullptr)
//             {
//                 if(oc->next->val == ob->val)
//                 {
//                     oc->next = oc->next->next;
//                 }
//                 else
//                 {
//                     oc = oc->next;
//                 }
//             }
//             ob = ob->next;
//         }
//         return head;
//     }
// };
class Solution {
public:
    ListNode* removeDuplicateNodes(ListNode* head) {
        if(head == nullptr) return head;
        unordered_set<int> occurred = {head->val};
        ListNode* pos = head;
        while(pos->next != nullptr)
        {
            ListNode* cur = pos->next;
            if(!occurred.count(cur->val))
            {
                occurred.insert(cur->val);
                pos = pos->next;
            }
            else
            {
                pos->next = pos->next->next;
            }
        }
        return head;
    }
};

int main()
{
    return 0;
}